<?php
namespace Admin\Model;
use Think\Model;
class PrivilegeModel extends Model 
{
	protected $insertFields = array('module_name','pri_name','controller_name','action_name','parent_id');
	protected $updateFields = array('id','module_name','pri_name','controller_name','action_name','parent_id');
	protected $_validate = array(
		array('module_name', '1,30', '的值最长不能超过 30 个字符！', 2, 'length', 3),
		array('pri_name', '1,30', '的值最长不能超过 30 个字符！', 2, 'length', 3),
		array('controller_name', '1,30', '的值最长不能超过 30 个字符！', 2, 'length', 3),
		array('action_name', '1,30', '的值最长不能超过 30 个字符！', 2, 'length', 3),
		array('parent_id', 'number', '必须是一个整数！', 2, 'regex', 3),
	);
	/************************************* 递归相关方法 *************************************/
	public function getTree()
	{
		$data = $this->select();
		return $this->_reSort($data);
	}
	private function _reSort($data, $parent_id=0, $level=0, $isClear=TRUE)
	{
		static $ret = array();
		if($isClear)
			$ret = array();
		foreach ($data as $k => $v)
		{
			if($v['parent_id'] == $parent_id)
			{
				$v['level'] = $level;
				$ret[] = $v;
				$this->_reSort($data, $v['id'], $level+1, FALSE);
			}
		}
		return $ret;
	}
	public function getChildren($id)
	{
		$data = $this->select();
		return $this->_children($data, $id);
	}
	private function _children($data, $parent_id=0, $isClear=TRUE)
	{
		static $ret = array();
		if($isClear)
			$ret = array();
		foreach ($data as $k => $v)
		{
			if($v['parent_id'] == $parent_id)
			{
				$ret[] = $v['id'];
				$this->_children($data, $v['id'], FALSE);
			}
		}
		return $ret;
	}
	/************************************ 其他方法 ********************************************/
	public function _before_delete($option)
	{
		// 先找出所有的子分类id
		$children = $this->getChildren($option['where']['id']);
		// 如果有子分类都删除掉
		if($children)
		{
			$this->error = '有下级数据无法删除';
			return FALSE;
		}
		//总中间表把相关的权限删除
		$rpModel = D('role_pri');
		$rpModel->where(array(
			'role_id'=>array('eq',$option['where']['id']),
		))->delete();
	}

	/*********************************检查当前管理员是否有权限访问******************************************/
	public function chk_pri(){
		//获得当前管理员访问的页面（模型名称、控制器名称、方法名称）
		//tp中带有三个常量函数 MODULE_NAME CONTROLLER_NAME ACTION_NAME
		$adminId = session('id');
        $arModel = D('admin_role');
		if($adminId == 1){ return TRUE;} //如果是超级管理员 直接返回true
         $has = $arModel->alias('a')
			 ->join('LEFT JOIN __ROLE_PRI__ b ON a.role_id = b.role_id
			 		LEFT JOIN __PRIVILEGE__ c ON b.pri_id = c.id')
			 ->where(array(
				 'admin_id'=>array('eq',$adminId),
				 'c.module_name'=>array('eq',MODULE_NAME),
				 'c.controller_name'=>array('eq',CONTROLLER_NAME),
				 'c.action_name'=>array('eq',ACTION_NAME),
			 ))->count();
		return ($has>0);
	}


	/********************取出当前管理员的前俩级权限******************************/
//	public function getBtns()
//	{
//		/*************** 先取出当前管理员所拥有的所有的权限 ****************/
//		$adminId = session('id');
//		if ($adminId == 1) {
//			$priModel = D('Privilege');
//			$priData = $priModel->select();
//		} else {
//			// 取出当前管理员所在角色 所拥有的权限
//			$arModel = D('admin_role');
//			$priData = $arModel->alias('a')
//				->field('DISTINCT c.id,c.pri_name,c.module_name,c.controller_name,c.action_name,c.parent_id')
//				->join('LEFT JOIN __ROLE_PRI__ b ON a.role_id=b.role_id
//			        LEFT JOIN __PRIVILEGE__ c ON b.pri_id=c.id')
//				->where(array(
//					'a.admin_id' => array('eq', $adminId),
//				))->select();
//		}
//		/*************** 从所有的权限中挑出前两级的 **********************/
//		$btns = array();  // 前两级权限
//		foreach ($priData as $k => $v) {
//			if ($v['parent_id'] == 0) {
//				// 再找这个顶的子级
//				foreach ($priData as $k1 => $v1) {
//					if ($v1['parent_id'] == $v['id']) {
//						$v['children'][] = $v1;
//					}
//				}
//				$btns[] = $v;
//			}
//		}
//		return $btns;
//	}
}